#ifndef HISTOGRAM_HPP
#define HISTOGRAM_HPP

//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------

namespace ImageAnalysis
{
//----------------------------------------------------------------------
// Cette classe correspond à l'histogramme des niveaux de
//gris d'un ensemble de pixels d'une image.
//----------------------------------------------------------------------
class Histogram
{
public:
        //----------------------------------------------------------------------
        // Structure
        //----------------------------------------------------------------------
		
        //----------------------------------------------------------------------
        // Constructeur
        //----------------------------------------------------------------------
        Histogram( int nbValues );

        //----------------------------------------------------------------------
        // Destructeur
        //----------------------------------------------------------------------
        virtual ~Histogram();

        //----------------------------------------------------------------------
        // Cette méthode renvoie le nombre de pixels associés à
		// un niveau de gris.
		//Contrat : l'index doit être compris entre 0 et le nombre de valeurs.
        //----------------------------------------------------------------------
        int GetNumberOfPixel( int index );

        //----------------------------------------------------------------------
        // Cette méthode permet d'ajouter un pixel à une valeur
		// de niveau de gris.
		// Contrat : l'index doit être compris entre 0 et le nombre de valeurs.
        //----------------------------------------------------------------------
        void AddPixelToValue( int index );

        //----------------------------------------------------------------------
        // Cette méthode renvoie la moyenne de l'histogramme
        //----------------------------------------------------------------------
        int GetMeanValue( );

        //----------------------------------------------------------------------
        // Cette méthode renvoie l'écart type de l'histogramme.
        //----------------------------------------------------------------------
        int GetStandardDeviation( );

        //----------------------------------------------------------------------
        // Cette méthode renvoie la valeur de niveau de gris
		// pour laquelle on a le plus grand nombre de pixels
        //----------------------------------------------------------------------
        int GetIndexMaximumValue( );

        //----------------------------------------------------------------------
        // Cette méthode renvoie le nombre de niveaux de gris
		// dont on se soucie. En général 256
        //----------------------------------------------------------------------
        int GetNumberOfValues( );

        //----------------------------------------------------------------------
        // Cette méthode permet de dessiner l'histogramme.
        //----------------------------------------------------------------------
        void Draw( );

	//----------------------------------------------------------------------
	// Permet de calculer le niveau de gris pour lequel la quantité de 
	// pixel de la zone prise dans l'intervalle [0, upperBound] est égal au 
	// pourcentage souhaité 
	//----------------------------------------------------------------------
	int GetIndexPercentil( float percentage, int upperBoundIndex );

private:
        //----------------------------------------------------------------------
        // Constructeur par copie et oprérateur d'affectation en privée pour
        // interdire leur utilisation
        //----------------------------------------------------------------------
        Histogram( const Histogram& copy);
        Histogram& operator=( const Histogram& copy );

        //----------------------------------------------------------------------
        // Permet de calculer l'histogramme cumulé
        //----------------------------------------------------------------------
		void computeAcculatedHistogram();

        //----------------------------------------------------------------------
        // Attributs de l'histogramme
        //  - tableau contenant le nombre de pixel cumulés
        //  - tableau contenant le nombre de pixel par valeur
        //  - valeur indiquant le nombre valeur
        //----------------------------------------------------------------------
		int* accumulatedNumberOfPixels;
        int* numberOfPixels;	
        int numberOfValues;

        int meanValue;
        int standartDeviationValue;
};

}
#endif //HISTOGRAM_HPP
